package ar.drools.apuestas;

import java.util.List;

import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import ar.drools.apuestas.modelo.Piloto;
import ar.drools.apuestas.utils.HTMLParser;

public class MainSpring {

	public static void main(String[] args) {
		
		
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "/drools-spring.xml" });
		StatefulKnowledgeSession session = (StatefulKnowledgeSession) context.getBean("kSession");

		insertFacts(session);
		session.dispose();
	}

	private static void insertFacts(StatefulKnowledgeSession kSession) {
		FactHandle ruleHandle;
		List<Piloto> listaPilotos =  HTMLParser.obtenerPilotosConDatos(); 
		
//		Piloto vettel = new Piloto();
//		vettel.setNombre("Sebastian Vettel");
//		vettel.setCantidadCarrerasCorridas((double) 118);
//		vettel.setCantidadCarrerasGanadas((double) 37);
//		vettel.setTiempoPromedioBox((double) 22);
//		vettel.setClasificadoEntrePrimerosDiez((double) 100);
//		vettel.setCantidadAbandonos((double) 21);
//		vettel.setPromedioPosicionFinalUltimas3((double) 1);
//		listaPilotos.add(vettel);
//		
//		Piloto webber = new Piloto();
//		webber.setNombre("Mark Webber");
//		webber.setCantidadCarrerasCorridas((double) 213);
//		webber.setCantidadCarrerasGanadas((double) 9);
//		webber.setTiempoPromedioBox((double) 22);
//		webber.setClasificadoEntrePrimerosDiez((double) 141);
//		webber.setCantidadAbandonos((double) 57);
//		webber.setPromedioPosicionFinalUltimas3((double) 2);
//		listaPilotos.add(webber);
//		
//		Piloto alonso = new Piloto();
//		alonso.setNombre("Fernando Alonso");
//		alonso.setCantidadCarrerasCorridas((double) 214);
//		alonso.setCantidadCarrerasGanadas((double) 32);
//		alonso.setTiempoPromedioBox((double) 22);
//		alonso.setClasificadoEntrePrimerosDiez((double) 175);
//		alonso.setCantidadAbandonos((double) 35);
//		alonso.setPromedioPosicionFinalUltimas3((double) 6);
//		listaPilotos.add(alonso);
//		
//		Piloto massa = new Piloto();
//		massa.setNombre("Felipe Massa");
//		massa.setCantidadCarrerasCorridas((double) 189);
//		massa.setCantidadCarrerasGanadas((double) 11);
//		massa.setTiempoPromedioBox((double) 22);
//		massa.setClasificadoEntrePrimerosDiez((double) 125);
//		massa.setCantidadAbandonos((double) 30);
//		massa.setPromedioPosicionFinalUltimas3((double) 7);
//		listaPilotos.add(massa);
//		
//		Piloto button = new Piloto();
//		button.setNombre("Jenson Button");
//		button.setCantidadCarrerasCorridas((double) 245);
//		button.setCantidadCarrerasGanadas((double) 15);
//		button.setTiempoPromedioBox((double) 23);
//		button.setClasificadoEntrePrimerosDiez((double) 148);
//		button.setCantidadAbandonos((double) 61);
//		button.setPromedioPosicionFinalUltimas3((double) 12);
//		listaPilotos.add(button);
//		
//		Piloto perez = new Piloto();
//		perez.setNombre("Sergio Perez");
//		perez.setCantidadCarrerasCorridas((double) 54);
//		perez.setCantidadCarrerasGanadas((double) 0);
//		perez.setTiempoPromedioBox((double) 23);
//		perez.setClasificadoEntrePrimerosDiez((double) 18);
//		perez.setCantidadAbandonos((double) 11);
//		perez.setPromedioPosicionFinalUltimas3((double) 10);
//		listaPilotos.add(perez);
//		
//		Piloto raikkonen = new Piloto();
//		raikkonen.setNombre("Kimi Raikkonen");
//		raikkonen.setCantidadCarrerasCorridas((double) 193);
//		raikkonen.setCantidadCarrerasGanadas((double) 20);
//		raikkonen.setTiempoPromedioBox((double) 23);
//		raikkonen.setClasificadoEntrePrimerosDiez((double) 160);
//		raikkonen.setCantidadAbandonos((double) 50);
//		raikkonen.setPromedioPosicionFinalUltimas3((double) 5);
//		listaPilotos.add(raikkonen);
//		
//		Piloto grosjean = new Piloto();
//		grosjean.setNombre("Romain Grosjean");
//		grosjean.setCantidadCarrerasCorridas((double) 43);
//		grosjean.setCantidadCarrerasGanadas((double) 0);
//		grosjean.setTiempoPromedioBox((double) 23);
//		grosjean.setClasificadoEntrePrimerosDiez((double) 27);
//		grosjean.setCantidadAbandonos((double) 14);
//		grosjean.setPromedioPosicionFinalUltimas3((double) 3);
//		listaPilotos.add(grosjean);
//		
//		Piloto hamilton = new Piloto();
//		hamilton.setNombre("Lewis Hamilton");
//		hamilton.setCantidadCarrerasCorridas((double) 127);
//		hamilton.setCantidadCarrerasGanadas((double) 22);
//		hamilton.setTiempoPromedioBox((double) 24);
//		hamilton.setClasificadoEntrePrimerosDiez((double) 113);
//		hamilton.setCantidadAbandonos((double) 19);
//		hamilton.setPromedioPosicionFinalUltimas3((double) 6);
//		listaPilotos.add(hamilton);
//		
//		Piloto rosberg = new Piloto();
//		rosberg.setNombre("Nico Rosberg");
//		rosberg.setCantidadCarrerasCorridas((double) 145);
//		rosberg.setCantidadCarrerasGanadas((double) 3);
//		rosberg.setTiempoPromedioBox((double) 23);
//		rosberg.setClasificadoEntrePrimerosDiez((double) 100);
//		rosberg.setCantidadAbandonos((double) 27);
//		rosberg.setPromedioPosicionFinalUltimas3((double) 4);
//		listaPilotos.add(rosberg);
//		
//		Piloto diresta = new Piloto();
//		diresta.setNombre("Paul Di Resta");
//		diresta.setCantidadCarrerasCorridas((double) 56);
//		diresta.setCantidadCarrerasGanadas((double) 0);
//		diresta.setTiempoPromedioBox((double) 22);
//		diresta.setClasificadoEntrePrimerosDiez((double) 19);
//		diresta.setCantidadAbandonos((double) 10);
//		diresta.setPromedioPosicionFinalUltimas3((double) 8);
//		listaPilotos.add(diresta);
//		
//		Piloto sutil = new Piloto();
//		sutil.setNombre("Adrian Sutil");
//		sutil.setCantidadCarrerasCorridas((double) 107);
//		sutil.setCantidadCarrerasGanadas((double) 0);
//		sutil.setTiempoPromedioBox((double) 23);
//		sutil.setClasificadoEntrePrimerosDiez((double) 24);
//		sutil.setCantidadAbandonos((double) 35);
//		sutil.setPromedioPosicionFinalUltimas3((double) 11);
//		listaPilotos.add(sutil);
//		
//		Piloto hulkenberg = new Piloto();
//		hulkenberg.setNombre("Nico Hulkenberg");
//		hulkenberg.setCantidadCarrerasCorridas((double) 55);
//		hulkenberg.setCantidadCarrerasGanadas((double) 0);
//		hulkenberg.setTiempoPromedioBox((double) 24);
//		hulkenberg.setClasificadoEntrePrimerosDiez((double) 26);
//		hulkenberg.setCantidadAbandonos((double) 9);
//		hulkenberg.setPromedioPosicionFinalUltimas3((double) 8);
//		listaPilotos.add(hulkenberg);
//		
//		Piloto gutierrez = new Piloto();
//		gutierrez.setNombre("Esteban Gutierrez");
//		gutierrez.setCantidadCarrerasCorridas((double) 17);
//		gutierrez.setCantidadCarrerasGanadas((double) 0);
//		gutierrez.setTiempoPromedioBox((double) 24);
//		gutierrez.setClasificadoEntrePrimerosDiez((double) 2);
//		gutierrez.setCantidadAbandonos((double) 3);
//		gutierrez.setPromedioPosicionFinalUltimas3((double) 12);
//		listaPilotos.add(gutierrez);
//		
//		Piloto ricciardo = new Piloto();
//		ricciardo.setNombre("Daniel Ricciardo");
//		ricciardo.setCantidadCarrerasCorridas((double) 48);
//		ricciardo.setCantidadCarrerasGanadas((double) 0);
//		ricciardo.setTiempoPromedioBox((double) 23);
//		ricciardo.setClasificadoEntrePrimerosDiez((double) 9);
//		ricciardo.setCantidadAbandonos((double) 8);
//		ricciardo.setPromedioPosicionFinalUltimas3((double) 13);
//		listaPilotos.add(ricciardo);
//		
//		Piloto vergne = new Piloto();
//		vergne.setNombre("Jean Eric Vergne");
//		vergne.setCantidadCarrerasCorridas((double) 37);
//		vergne.setCantidadCarrerasGanadas((double) 0);
//		vergne.setTiempoPromedioBox((double) 23);
//		vergne.setClasificadoEntrePrimerosDiez((double) 3);
//		vergne.setCantidadAbandonos((double) 10);
//		vergne.setPromedioPosicionFinalUltimas3((double) 14);
//		listaPilotos.add(vergne);
//		
//		Piloto maldonado = new Piloto();
//		maldonado.setNombre("Pastor Maldonado");
//		maldonado.setCantidadCarrerasCorridas((double) 56);
//		maldonado.setCantidadCarrerasGanadas((double) 1);
//		maldonado.setTiempoPromedioBox((double) 24);
//		maldonado.setClasificadoEntrePrimerosDiez((double) 14);
//		maldonado.setCantidadAbandonos((double) 17);
//		maldonado.setPromedioPosicionFinalUltimas3((double) 13);
//		listaPilotos.add(maldonado);
//		
//		Piloto bottas = new Piloto();
//		bottas.setNombre("Valtteri Bottas");
//		bottas.setCantidadCarrerasCorridas((double) 17);
//		bottas.setCantidadCarrerasGanadas((double) 0);
//		bottas.setTiempoPromedioBox((double) 24);
//		bottas.setClasificadoEntrePrimerosDiez((double) 1);
//		bottas.setCantidadAbandonos((double) 1);
//		bottas.setPromedioPosicionFinalUltimas3((double) 16);
//		listaPilotos.add(bottas);
//		
//		Piloto pic = new Piloto();
//		pic.setNombre("Charles Pic");
//		pic.setCantidadCarrerasCorridas((double) 37);
//		pic.setCantidadCarrerasGanadas((double) 0);
//		pic.setTiempoPromedioBox((double) 25);
//		pic.setClasificadoEntrePrimerosDiez((double) 0);
//		pic.setCantidadAbandonos((double) 9);
//		pic.setPromedioPosicionFinalUltimas3((double) 17);
//		listaPilotos.add(pic);
//		
//		Piloto vandergarde = new Piloto();
//		vandergarde.setNombre("Giedo Van der Garde");
//		vandergarde.setCantidadCarrerasCorridas((double) 17);
//		vandergarde.setCantidadCarrerasGanadas((double) 0);
//		vandergarde.setTiempoPromedioBox((double) 25);
//		vandergarde.setClasificadoEntrePrimerosDiez((double) 0);
//		vandergarde.setCantidadAbandonos((double) 4);
//		vandergarde.setPromedioPosicionFinalUltimas3((double) 16);
//		listaPilotos.add(vandergarde);
//		
//		
//		Piloto bianchi = new Piloto();
//		bianchi.setNombre("Jules Bianchi");
//		bianchi.setCantidadCarrerasCorridas((double) 17);
//		bianchi.setCantidadCarrerasGanadas((double) 0);
//		bianchi.setTiempoPromedioBox((double) 25);
//		bianchi.setClasificadoEntrePrimerosDiez((double) 0);
//		bianchi.setCantidadAbandonos((double) 3);
//		bianchi.setPromedioPosicionFinalUltimas3((double) 18);
//		listaPilotos.add(bianchi);
//		
//		Piloto chilton = new Piloto();
//		chilton.setNombre("Max Chilton");
//		chilton.setCantidadCarrerasCorridas((double) 17);
//		chilton.setCantidadCarrerasGanadas((double) 0);
//		chilton.setTiempoPromedioBox((double) 25);
//		chilton.setClasificadoEntrePrimerosDiez((double) 0);
//		chilton.setCantidadAbandonos((double) 0);
//		chilton.setPromedioPosicionFinalUltimas3((double) 19);
//		listaPilotos.add(chilton);
		
		for (Piloto piloto : listaPilotos) {
			kSession.getAgenda().getAgendaGroup("procesamientoDatos").setFocus();
			ruleHandle = kSession.insert(piloto);
			kSession.fireAllRules();
			kSession.retract(ruleHandle);

			// reinserta el piloto y corre el segundo grupo de reglas (todas las de procesamiento de datos intermedios)
			kSession.getAgenda().getAgendaGroup("obtenerResultados").setFocus();
			ruleHandle = kSession.insert(piloto);
			kSession.fireAllRules();
			kSession.retract(ruleHandle);

			// reinserta el piloto y corre el ultimo grupo de reglas para obtener el resultado final
			kSession.getAgenda().getAgendaGroup("resultadoFinal").setFocus();
			ruleHandle = kSession.insert(piloto);
			kSession.fireAllRules();
			
			System.out.println(piloto);
		}
		
	}

}
